package com.cskaoyan.javase.method._0introduction;

/**
 * 使用方法解决代码复用问题，复用代码，避免重复代码。
 * 方法的语法：
 * 一般情况下，定义一个方法是以下语法结构：
 * [修饰符列表] 返回值类型 方法名 (形式参数列表){
 *   // 方法体
 * }
 * 在具体了解每个部分的语义之前，我们需要了解 两个非常重要的概念：
 *      1."[修饰符列表] 返回值类型 方法名 (形式参数列表)"
 *          合起来称之 方法的声明（也叫方法头）
 *      2."方法名 (形式参数列表)" 合起来称之为 方法的签名
 *
 * 下面逐一解释方法语法中的每一个结构:
 *      1.修饰符列表,指的是可以用来修饰方法的修饰符组成的列表
 *          目前的学习阶段,我们先默认方法的修饰符列表是"public static"
 *          并且要清楚的是,方法的修饰符列表并不是必须的,完全可以省略,什么都不写
 *
 *      2.返回值类型,指的是返回值的数据类型,该结构是不可省略的,每个方法都必须有该结构.
 *      返回值: 指的是方法实现功能,解决需求时,给出的结果数据
 *      返回值类型可以是基本数据类型,也可以是引用数据类型
 *
 *      3.方法名,方法名也是一个标识符,应该小驼峰式书写
 *          应该使用合法的英文单词组成的字符串,而且由于方法往往实现功能,完成操作
 *          所以方法名往往会带动词
 *          比如一个"求最大值"的方法,可以命名为"getMaxValue"
 *          这就是"见名知意"
 *
 *      4.形式参数列表,指的是由形式参数组成的列表.
 *          形式参数: 方法在实现功能时,可能需要外界传入一些数据,那么这些数据:
 *              a.数据类型是什么?
 *              b.需要几个数据?
 *              ..
 *              之类的问题,都需要形式参数来明确指出
 *              所以形式参数,简称形参,它的作用是用来规范/明确,方法在调用时,需要的参数数据的个数,数据类型.
 *              而且这些参数数据在传入方法后,需要在方法体中使用,所以它需要一个名字.
 *              于是
 *              一个形参的语法是这样的:
 *              数据类型 形参名;
 *          问题:
 *              1.形参是不是一个真正意义上的参数?是不是一个数据?
 *                  不是,它不是一个真正意义上的数据,它只是一个占位符
 *              2.方法执行时,一定需要参数吗?形参一定要写吗?
 *                  不是,方法完全可能不需要任何参数就能执行,这种方法就是无参方法
 *              3.形参的个数有限制吗?
 *                  没有,完全可以写多个形参,每个形参之间要用","隔开
 *
 *      5.方法体
 *          属于一个代码块,方法体可以为空,也可以写任何语句
 *          它就是方法实现功能时执行的内容.
 *
 * 方法的语法讲完了,现在开始定义方法:
 *      方法定义的位置:
 *          必须定义在类体中,而且方法不能嵌套定义
 *          也就是说,必须定义在另一个方法的外部
 * 于是开始定义方法,对照着方法的语法,比着葫芦画葫芦.
 * 如果某个方法,返回值类型明确指出了该方法需要返回一个对应数据类型的返回值,那么就必须在方法体中,使用"return + 值"来表示方法的返回值,如果不写就会编译报错
 *  Missing return statement
 *  也就是说,return在方法中有两个作用:
 *          1.结束方法
 *          2.表示返回值
 * 这两个作用是同时生效的.
 *
 * 方法定义完毕后,开始调用方法:
 *      1.在Java程序当中,main方法是入口方法
 *      任何Java方法/代码,都必须直接或者间接在main方法中被调用/执行,否则该方法/代码是永远不会被执行的.
 *      方法不调用不执行
 *
 *      2.一个方法,如果它的修饰符列表中存在"static"关键字,那么在同一个类的main方法中
 *      可以直接用"方法名(实参列表)"调用它
 *      实参列表: 指的是实际参数(实参)组成的列表
 *      实际参数: 指的是在方法调用时,具体传入方法的一个参数,它是一个真正的参数,真正的数据,有别于形式参数.
 *
 *      3.如果方法具有返回值,那么建议对该返回值做处理
 *      对该方法调用的处理,实际上就是处理返回值
 *
 *  注意事项:
 *      1.方法的定义位置和方法的调用结果没有关系
 *      2.一个类中多个方法之间也是没有关系的(除非它们本身就互相调用了)
 *      扩展:
 *          对于方法而言,同一个类中,只要修饰符列表中有static关键字,那么它们就可以互相调用
 *          调用的方式是:"方法名(实参)"
 *
 * @since 11:28
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {
    public static void main(String[] args) {
        // Result of 'NewDemo.sum()' is ignored
        /*
            因为该方法调用的返回值是一个int数值
            所以可以对方法调用做:
                a.接收数据
                b.输出数据
                c."加减乘除"等
            原因是对方法调用的处理就是处理方法的返回值
         */
        int sumValue = sum(0, 1);
        System.out.println(sum(1, 1));
        System.out.println(sum(2, 2) + 100);
        System.out.println(sum(3, 3) / 2);

        System.out.println(test());
        System.out.println(test() + 123);
        System.out.println(test().length());
        // System.out.println(test() - 123);
        // System.out.println(test() / 123);
    }

    public static String test() {
        return "666";
    }

    // 定义一个方法,该方法的功能是: 求两个int数据的和
    public static int sum(int num1, int num2) {
        // Local variable 'result' is redundant
        // Local variable = 局部变量
        // int result = num1 + num2;
        // return result;
        return num1 + num2;
    }
}
